package com.weareint.biz.service.impl;

import com.weareint.biz.vo.ProductBomVo;
import com.weareint.biz.search.ProductBomSearch;
import com.weareint.biz.converter.ProductBomConverter;
import com.weareint.biz.repository.ProductBomRepository;
import com.weareint.biz.entity.ProductBom;
import com.weareint.biz.entity.QProductBom;
import com.weareint.biz.service.IProductBomService;
import com.weareint.common.jpabase.QueryCondition;
import com.weareint.common.jpabase.ConditionService;
import com.weareint.common.exception.BizException;
import com.weareint.common.exception.ExceptionEnum;
import com.querydsl.jpa.impl.JPAQuery;
import com.querydsl.jpa.impl.JPAQueryFactory;
import com.querydsl.core.QueryResults;
import com.querydsl.core.types.dsl.StringTemplate;
import com.querydsl.core.types.dsl.Expressions;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.PageImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;



/**
 * <pre>
 *      产品BOM
 * </pre>
 *
 * @author Johnny
 * @date 2021-09-28
 */
@Service
@Transactional(rollbackFor = {Exception.class, RuntimeException.class, Error.class})
@Slf4j
public class ProductBomServiceImpl implements IProductBomService,ConditionService<ProductBom> {

    private final JPAQueryFactory queryFactory;

    private final ProductBomRepository productBomRepository;

    public ProductBomServiceImpl(JPAQueryFactory queryFactory, ProductBomRepository productBomRepository) {
        this.queryFactory = queryFactory;
        this.productBomRepository = productBomRepository;
    }

    private QProductBom qProductBom = QProductBom.productBom;

    /**
     * 带条件查询的 分页接口
     *
     * @param queryCondition : 查询条件=ProductBomSearch
     * @param pageable : pageable
     * @return : Page<ProductBomVo>
     */
    @Override
    public Page<ProductBomVo> listByCondition(QueryCondition queryCondition, Pageable pageable) {
        List<ProductBomVo> list = new ArrayList<>();

        JPAQuery<ProductBom> jpaQuery = queryFactory.select(qProductBom)
            .from(qProductBom)
            .offset(pageable.getPageNumber() * pageable.getPageSize())
            .limit(pageable.getPageSize());

        //添加 查询条件
        fillCondition(jpaQuery, queryCondition);

        QueryResults<ProductBom> queryResults = jpaQuery.fetchResults();

        queryResults.getResults().forEach(productBom -> {
             ProductBomVo productBomVo = ProductBomConverter.INSTANCE.domain2vo(productBom);
             list.add(productBomVo);
        });
        return new PageImpl<>(list, pageable, queryResults.getTotal());
    }
    /**
     * 新增接口
     *
     * @param productBomVo : 新增对象
     */
    @Override
    public void add(ProductBomVo productBomVo) {
        productBomVo.setId(null);
        ProductBom productBom = ProductBomConverter.INSTANCE.vo2domain(productBomVo);
        productBomRepository.save(productBom);
    }
    /**
     * 更新接口
     *
     * @param productBomVo : 更新对象
     */
    @Override
    public void edit(ProductBomVo productBomVo) {
        if (productBomRepository.existsById(productBomVo.getId())) {
            ProductBom productBom = ProductBomConverter.INSTANCE.vo2domain(productBomVo);
            productBomRepository.save(productBom);
        } else {
            throw new BizException(ExceptionEnum.NOT_FIND_BY_ID);
        }
    }
    /**
     * 删除接口
     *
     * @param id : 删除对象的Id
     */
    @Override
    public void delete(Long id) {
        if (productBomRepository.existsById(id)) {
            productBomRepository.deleteById(id);
        } else {
            throw new BizException(ExceptionEnum.NOT_FIND_BY_ID);
        }
    }
    /**
    * 批量删除接口
    *
    * @param ids : 批量删除对象
    */
    @Override
    public void deletes(List<Long> ids) {
        productBomRepository.deleteByIdIn(ids);
    }
    /**
     * 填充 查询条件
     *
     * @param jpaQuery : jpaQuery
     * @param queryCondition : 查询条件
     */
    @Override
    public void fillCondition(JPAQuery<ProductBom> jpaQuery, QueryCondition queryCondition) {
        ProductBomSearch productBomSearch = (ProductBomSearch) queryCondition;
        if (productBomSearch.getId() != null && productBomSearch.getId() != 0L) {
            jpaQuery.where(qProductBom.id.eq(productBomSearch.getId()));
        }
        if (productBomSearch.getCreator() != null && productBomSearch.getCreator() != 0L) {
            jpaQuery.where(qProductBom.creator.eq(productBomSearch.getCreator()));
        }
        if (productBomSearch.getCreateTime() != null) {
            //日期查询 建立格式化模板
            StringTemplate dateExpr = Expressions.stringTemplate("DATE_FORMAT({0},'%Y-%m-%d')",qProductBom.createTime);
            jpaQuery.where(dateExpr.eq(productBomSearch.getCreateTime()));
        }
        if (productBomSearch.getUpdater() != null && productBomSearch.getUpdater() != 0L) {
            jpaQuery.where(qProductBom.updater.eq(productBomSearch.getUpdater()));
        }
        if (productBomSearch.getUpdateTime() != null) {
            //日期查询 建立格式化模板
            StringTemplate dateExpr = Expressions.stringTemplate("DATE_FORMAT({0},'%Y-%m-%d')",qProductBom.updateTime);
            jpaQuery.where(dateExpr.eq(productBomSearch.getUpdateTime()));
        }
        if (productBomSearch.getDeleted() != null && productBomSearch.getDeleted() != 0) {
            jpaQuery.where(qProductBom.deleted.eq(productBomSearch.getDeleted()));
        }
        if (StringUtils.isNotEmpty(productBomSearch.getRemark())) {
            jpaQuery.where(qProductBom.remark.eq(productBomSearch.getRemark()));
        }
        if (StringUtils.isNotEmpty(productBomSearch.getCode())) {
            jpaQuery.where(qProductBom.code.eq(productBomSearch.getCode()));
        }
        if (productBomSearch.getProductId() != null && productBomSearch.getProductId() != 0L) {
            jpaQuery.where(qProductBom.productId.eq(productBomSearch.getProductId()));
        }
        if (StringUtils.isNotEmpty(productBomSearch.getProductName())) {
            jpaQuery.where(qProductBom.productName.eq(productBomSearch.getProductName()));
        }
    }


}
